import java.util.LinkedList;
import java.util.Queue;

class Solution04 {
    // 定义数轴
    int[] dx = { 0, 0, -1, 1 };
    int[] dy = { 1, -1, 0, 0 };
    // 定义全局变量 行列
    int m, n;
    // 定义同规模大小的 boolean 数组
    boolean[][] vis;

    public int maxAreaOfIsland(int[][] grid) {
        m = grid.length;
        n = grid[0].length;
        vis = new boolean[m][n];
        // 定义一个变量记录最终结果
        int ret = 0;
        // 从左到右循环遍历该二维数组
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1 && !vis[i][j]) {
                    ret = Math.max(ret, bfs(grid, i, j));
                }
            }
        }
        return ret;
    }

    public int bfs(int[][] grid, int i, int j) {
        // 定义一个变量接受最终结果 至少是1
        int ret = 1;
        // 定义一个队列
        Queue<int[]> q = new LinkedList<>();
        // 将数据添加到队列
        q.add(new int[] { i, j });
        // 修改boolean值
        vis[i][j] = true;
        // 进行循环
        while (!q.isEmpty()) {
            // 弹出队首元素
            int[] tmp = q.poll();
            int a = tmp[0], b = tmp[1];
            // 上下左右四个方向
            for (int k = 0; k < 4; k++) {
                int x = a + dx[k], y = b + dy[k];
                // 进行边界条件判断
                if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y]) {
                    // 添加到队列
                    q.add(new int[] { x, y });
                    // 结果加一
                    ret++;
                    // 修改boolean值
                    vis[x][y] = true;
                }
            }
        }
        return ret;
    }
}